package com.insight.modules.system.controller;

import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import lombok.extern.slf4j.Slf4j;
import com.insight.common.api.vo.Result;
import com.insight.common.system.query.QueryGenerator;
import com.insight.modules.system.entity.SysDataLog;
import com.insight.modules.system.service.ISysDataLogService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;

import javax.servlet.http.HttpServletRequest;
import java.util.ArrayList;
import java.util.List;

@RestController
@RequestMapping("/sys/dataLog")
@Slf4j
@Slf4j
@RestController
@RequestMapping("/sys/dataLog")
public class SysDataLogController {

	// 注入数据日志服务接口，用于操作数据日志相关业务
	@Autowired
	private ISysDataLogService service;

	/**
	 * 分页查询数据日志列表
	 *
	 * @param dataLog  查询条件封装的实体类
	 * @param pageNo   当前页码，默认1
	 * @param pageSize 每页记录数，默认10
	 * @param req      HttpServletRequest，用于获取请求参数
	 * @return 分页结果，包含日志列表及分页信息
	 */
	@RequestMapping(value = "/list", method = RequestMethod.GET)
	public Result<IPage<SysDataLog>> queryPageList(SysDataLog dataLog,
												   @RequestParam(name = "pageNo", defaultValue = "1") Integer pageNo,
												   @RequestParam(name = "pageSize", defaultValue = "10") Integer pageSize,
												   HttpServletRequest req) {

		Result<IPage<SysDataLog>> result = new Result<>();
		// 通过工具类构建查询条件Wrapper
		QueryWrapper<SysDataLog> queryWrapper = QueryGenerator.initQueryWrapper(dataLog, req.getParameterMap());
		// 构造分页对象
		Page<SysDataLog> page = new Page<>(pageNo, pageSize);
		// 调用服务执行分页查询
		IPage<SysDataLog> pageList = service.page(page, queryWrapper);

		// 记录日志输出分页信息，方便调试
		log.info("查询当前页：" + pageList.getCurrent());
		log.info("查询当前页数量：" + pageList.getSize());
		log.info("查询结果数量：" + pageList.getRecords().size());
		log.info("数据总数：" + pageList.getTotal());

		// 设置查询成功结果
		result.setSuccess(true);
		result.setResult(pageList);
		return result;
	}

	/**
	 * 查询两个指定ID的数据日志，用于对比数据
	 *
	 * @param req HttpServletRequest，包含dataId1和dataId2两个参数
	 * @return 返回两个数据日志实体列表，供前端展示对比
	 */
	@RequestMapping(value = "/queryCompareList", method = RequestMethod.GET)
	public Result<List<SysDataLog>> queryCompareList(HttpServletRequest req) {
		Result<List<SysDataLog>> result = new Result<>();
		if (req == null) {
			result.setSuccess(false);
			return result;
		}
		String dataId1 = req.getParameter("dataId1");
		String dataId2 = req.getParameter("dataId2");
		List<String> idList = new ArrayList<String>();
		if (dataId1 != null) {
			idList.add(dataId1);
		}
		if (dataId2 != null) {
			idList.add(dataId2);
		}
		if (idList.isEmpty() || service == null) {
			result.setSuccess(false);
			return result;
		}
		try {
			List<SysDataLog> list = (List<SysDataLog>) service.listByIds(idList);
			result.setResult(list);
			result.setSuccess(true);
		} catch (Exception e) {
			log.error(e.getMessage(), e);
		}
		return result;
	}

	/**
	 * 查询某个数据表中某条数据的所有版本信息
	 *
	 * @param req HttpServletRequest，包含dataTable和dataId参数
	 * @return 指定数据记录的版本日志列表，或提示未找到版本信息
	 */
	@RequestMapping(value = "/queryDataVerList", method = RequestMethod.GET)
	public Result<List<SysDataLog>> queryDataVerList(HttpServletRequest req) {
		Result<List<SysDataLog>> result = new Result<>();
		// 获取请求参数：表名和数据ID
		String dataTable = req.getParameter("dataTable");
		String dataId = req.getParameter("dataId");

		// 构建查询条件：匹配数据表名和数据ID
		QueryWrapper<SysDataLog> queryWrapper = new QueryWrapper<>();
		queryWrapper.eq("data_table", dataTable);
		queryWrapper.eq("data_id", dataId);

		// 查询符合条件的版本日志列表
		List<SysDataLog> list = service.list(queryWrapper);

		// 判断是否查询到版本信息
		if(list == null || list.isEmpty()) {
			// 未查询到，返回错误提示
			result.error500("未找到版本信息");
		} else {
			// 查询成功，返回版本日志列表
			result.setResult(list);
			result.setSuccess(true);
		}
		return result;
	}
}

